package pe.com.hermes.hermetic.web.controller.reportes;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.ComprobanteServicioBean;
import pe.com.hermes.hermetic.beans.DenominacionMonedaBean;
import pe.com.hermes.hermetic.beans.TiposBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.controller.general.MostrarReporteController;
import pe.com.hermes.hermetic.web.forms.HMF3008Form;
import pe.com.hermes.hermetic.web.forms.HMF3008eForm;
import pe.com.hermes.hermetic.web.forms.HMF4010Form;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.hermetic.negocio.ultil.Util;

import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;

import java.io.OutputStream;

import java.text.DateFormat;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

@RequestMapping("/mostrarHWF3008.html")
@SessionAttributes(value={"codOpci","desOpci"})
@Controller
public class IngresosSalidadAgenciasController implements IController{

    private Logger logger = Logger.getLogger(this.getClass());
    
    @Autowired
    private HermeticFacade servicioHermetic;
    
    @Autowired
    private MostrarReporteController reporteFactory;  
    
    @RequestMapping(method=RequestMethod.GET)
    protected String showForm(ModelMap model, HttpServletRequest request) throws Exception {

        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_INGRESO_SALIDA_AGENCIA)) {
            return FORM_ACCESS_NULL_VIEW;
        }

        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");

        HMF3008Form form = new HMF3008Form();
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);

        java.util.Date date = new java.util.Date();
        DateFormat dt = DateFormat.getTimeInstance(DateFormat.SHORT);
        try {
            String fecha = servicioHermetic.getFechaHoy();
            String h = dt.format(date);            
            form.setFechadesde(fecha);
            form.setFechahasta(fecha);
            form.setHora(h);
            form.setFecha(fecha);
            AuditBean auditBean = new AuditBean(INGR_SALI_AGEN);
            servicioHermetic.inseAudit(auditBean);
            String codOpci = IWebOpciones.INGR_SALI_AGEN;
            String desOpci = servicioHermetic.getDesOpci(codOpci, request);
            model.put("codOpci",codOpci);
            model.put("desOpci",desOpci);
            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("Error en el proceso. "+ e);
            return FORM_ERROR_VIEW;
        }        

        return FORM_INGR_SALI_AGENCIAS_VIEW;
    }

    @RequestMapping(params="accion=mostrar")
    private String mostrar (ModelMap model,@ModelAttribute(FORM_KEY) HMF3008Form form, HttpServletRequest request) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_INGRESO_SALIDA_AGENCIA)) {
            return FORM_ACCESS_NULL_VIEW;
        }    
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 3;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");
        
        String fechaDesde = form.getFechadesde();
        String fecha = form.getFecha();
        
        DecimalFormatSymbols dfs = new DecimalFormatSymbols();
        dfs.setDecimalSeparator('.');
        dfs.setGroupingSeparator(',');
        DecimalFormat df1 = new DecimalFormat("###,###,##0.00", dfs);
        df1.setGroupingSize(3);
        try {

            List listaEntradasSalidasAgencias = servicioHermetic.getEntradasSalidasAgencias(cliente, 
                                                                  sucursal, 
                                                                  form.getFechadesde(), 
                                                                  form.getFechahasta());
            List listaEntradasSalidasAgenciasNuevo = new ArrayList();
            int tam = listaEntradasSalidasAgencias.size();
            String var1 = "100";
            
            List listMontos = new ArrayList();
            if (listaEntradasSalidasAgencias != null) {
               
                 List listUnidMone = servicioHermetic.getTipoUniMone();
                 for(Iterator iter = listUnidMone.iterator(); 
                          iter.hasNext(); ){
                     TiposBean unid_mone =(TiposBean)iter.next();
                     DenominacionMonedaBean monto = new DenominacionMonedaBean();
                     double sumaIng = 0;
                     double sumaSal = 0;
                     for(Iterator ite = listaEntradasSalidasAgencias.iterator();ite.hasNext();){
                         ComprobanteServicioBean bean = (ComprobanteServicioBean)ite.next();
                         if(bean.getTipoUnidad().equalsIgnoreCase(unid_mone.getCodigo())){
                             if(bean.getTipoRem().equalsIgnoreCase("ING")){
                                 sumaIng = sumaIng + Double.parseDouble(bean.getMonto().replaceAll(",",""));
                             }else{
                                 sumaSal = sumaSal + Double.parseDouble(bean.getMonto().replaceAll(",",""));
                             }
                         }
                      }    
                     if(sumaIng!=0.00||sumaSal!=0.00){
                         monto.setCodDenominacion(unid_mone.getCodigo());
                         monto.setMensaje(unid_mone.getDescripcion());
                         monto.setMontoIng(df1.format(sumaIng));
                         monto.setMontoSal(df1.format(sumaSal));
                         listMontos.add(monto);
                     }
                 }
                /*request.setAttribute("registros", tam);
                request.setAttribute("listaEntradasSalidasAgencias",listaEntradasSalidasAgencias);
                request.setAttribute("genera", "1"); 
                request.setAttribute("listMontos", listMontos);
                */
                model.put("registros", tam);
                model.put("listaEntradasSalidasAgencias",listaEntradasSalidasAgencias);
                model.put("genera", "1"); 
                model.put("listMontos", listMontos);
                
            }
            //Al cierre
            try {
                DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

                // Get Date 1
                Date d1 = df.parse(fechaDesde);

                // Get Date 2
                Date d2 = df.parse(fecha);

                String relation;
                if (d1.equals(d2)) {
                    relation = "Las fechas son iguales";
                    java.util.Date date = new java.util.Date();
                    DateFormat dt = DateFormat.getTimeInstance(DateFormat.SHORT);
                    String h = dt.format(date);
                    form.setHora(h);
                } else if (d1.before(d2)) {
                    relation = "Anterior";
                    if (listaEntradasSalidasAgencias != null) {
                        form.setHora("Al Cierre");
                    }
                } else {
                    relation = "Mayor";
                }
                //System.out.println(d1 + " es " + relation + ' ' + d2);
            } catch (Exception e) {
                e.printStackTrace();
                //                  accionMapa = 0;
            }
            //Fin al cierre
 
            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }

        return FORM_INGR_SALI_AGENCIAS_VIEW;
    }


    @RequestMapping(params="accion=exportarExcel")
    private String exportarExcel (ModelMap model,@ModelAttribute(FORM_KEY) HMF3008Form form, HttpServletRequest request, HttpServletResponse response) throws Exception {    
    
        HttpSession session = request.getSession(false);        
        if (request.getSession().getAttribute("usuario") == null)
            return FORM_SESSION_FINISH;

        List listaTransacciones = (List)session.getAttribute("listaMenu3");
        if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.REPORTE_INGRESO_SALIDA_AGENCIA)) {
            return FORM_ACCESS_NULL_VIEW;
        }    
        form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
        
        //int accionMapa = 3;
        String cliente = (String)request.getSession().getAttribute("cliente");
        String sucursal = (String)request.getSession().getAttribute("sucursal");
      
        //HMF3008Form form = (HMF3008Form)form;
        
        form.setCliente((String)request.getSession().getAttribute("cliente"));
        String Fechadesde = form.getFechadesde();
        String Fechahasta = form.getFechahasta();
        request.setAttribute("fechadesde", Fechadesde);
        request.setAttribute("fechahasta", Fechahasta);
        form.setNombreCliente((String)request.getSession(false).getAttribute("nombreCliente"));
        try {
            HSSFWorkbook wb = new HSSFWorkbook();            
            if (form.getCliente().equals("14")){
                form.setListaEntradasSalidasAgencias(servicioHermetic.getEntradasSalidasAgenciasReporteExcel(form.getCliente(), 
                                                                  sucursal, 
                                                                  Fechadesde, 
                                                                  Fechahasta));            
            }
            else{
                form.setListaEntradasSalidasAgencias(servicioHermetic.getEntradasSalidasAgencias(form.getCliente(), 
                                                                  sucursal, 
                                                                  Fechadesde, 
                                                                  Fechahasta));
            }
            wb = exportarFormatoExcel(form);
            response.addHeader("Content-type", "application/vnd.ms-excel");
            response.addHeader("Content-Disposition", "attachment; filename=IngSalAgen.xls");
            response.setContentType("Content-type: application/vnd.ms-excel");
            
            response.setHeader("Cache-Control","cache"); // HTTP 1.1
            response.setHeader("Pragma","cache"); // HTTP 1.0
            response.setDateHeader ("Expires", -1);  
            
            OutputStream out = response.getOutputStream();
            wb.write(out);
            out.close();         
    
            model.put(FORM_KEY,form);  
        } catch (Exception e) {
            e.printStackTrace();
            //accionMapa = 0;
            return FORM_ERROR_VIEW;
        }

        return FORM_INGR_SALI_AGENCIAS_VIEW;
    }


    private HSSFWorkbook exportarFormatoExcel(HMF3008Form form) {
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("IngSalAgen");
        HSSFRow row = sheet.createRow((short)11);
        //creacion de Estilos
        HSSFCellStyle cs = wb.createCellStyle();
        HSSFCellStyle cs2 = wb.createCellStyle();            
        HSSFFont f = wb.createFont();
        HSSFDataFormat df = wb.createDataFormat();
        df.getFormat("text");
        f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cs.setFont(f);
        cs2.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));
        
        //CABECERA
        row = sheet.createRow((short)2);
        row.createCell(2).setCellStyle(cs);            
        //titulo
        row.createCell(2).setCellValue("MOVIMIENTO DE INGRESOS Y SALIDAS - AGENCIAS");
        row.getCell(2).setCellStyle(cs);
        //dos lineas en blanco
        row = sheet.createRow((short)4);
        row = sheet.createRow((short)5);
        //nombre de banco
        row.createCell(0).setCellValue(form.getNombreCliente());
        //linea en blanco
        row = sheet.createRow((short)6);
        //linea de rango de fechas
        row.createCell(0).setCellValue("Desde");
        row.createCell(1).setCellValue(form.getFechadesde());
        row.createCell(2).setCellValue("Hasta");
        row.createCell(3).setCellValue(form.getFechahasta());
        //linaea en blanco
        row = sheet.createRow((short)7);
        row = sheet.createRow((short)8);
        //FIN CABECERA
        if(form.getCliente().equals("14")){            
            row.createCell(0).setCellValue("Moneda");
            row.createCell(1).setCellValue("Emisora");
            row.createCell(2).setCellValue("Receptora");            
            row.createCell(3).setCellValue("Cuenta Contable");
            row.createCell(4).setCellValue("RC");
            row.createCell(5).setCellValue("Debe");
            row.createCell(6).setCellValue("Haber");
            row.createCell(7).setCellValue("Nro de Nota");
            row.createCell(8).setCellValue("Glosa");
            row.createCell(9).setCellValue("Iniciales");
            row.createCell(10).setCellValue("No");
            int count = 0;
            for(Iterator ite= form.getListaEntradasSalidasAgencias().iterator();ite.hasNext();){
                count++;
                row.getCell(3).setCellStyle(cs2);
                ComprobanteServicioBean csBean = (ComprobanteServicioBean)ite.next();
                row = sheet.createRow((short)count+8);
                row.createCell(0).setCellValue(csBean.getTipoUnidad());
                row.createCell(1).setCellValue(csBean.getDesAgent());
                row.createCell(2).setCellValue(csBean.getDesPunto());            
                row.createCell(3).setCellValue(new HSSFRichTextString(csBean.getCuenta()));
                row.createCell(4).setCellValue(csBean.getResp());
                row.createCell(5).setCellValue(csBean.getValor());
                row.createCell(6).setCellValue(csBean.getValor2());
                row.createCell(7).setCellValue(csBean.getNumero());
                row.createCell(8).setCellValue(csBean.getObs());
                row.createCell(9).setCellValue(csBean.getTipoDoc());
                row.createCell(10).setCellValue(csBean.getCantidad());
                }     
        }
        else{
            row.createCell(0).setCellValue("Fecha");
            row.createCell(1).setCellValue("Serie");
            row.createCell(2).setCellValue("CS");            
            row.createCell(3).setCellValue("Punto");
            row.createCell(4).setCellValue("Tipo");
            row.createCell(5).setCellValue("Moneda");
            row.createCell(6).setCellValue("Monto");
            int count = 0;
            for(Iterator ite= form.getListaEntradasSalidasAgencias().iterator();ite.hasNext();){
                count++;
                row.getCell(3).setCellStyle(cs2);
                ComprobanteServicioBean csBean = (ComprobanteServicioBean)ite.next();
                row = sheet.createRow((short)count+8);
                row.createCell(0).setCellValue(csBean.getFecha());
                row.createCell(1).setCellValue(csBean.getSerie());
                row.createCell(2).setCellValue(new HSSFRichTextString(csBean.getNumero()));            
                row.createCell(3).setCellValue(csBean.getDesPunto());
                row.createCell(4).setCellValue(csBean.getTipoRem());
                row.createCell(5).setCellValue(csBean.getMoneda());
                row.createCell(6).setCellValue(csBean.getMonto());
                }    
        }
         return wb;
    }

}
